package com.yun2.bms.dao.impl;

import com.yun2.bms.dao.IBaseDao;
import com.yun2.bms.model.User;
import com.yun2.bms.utils.DBUtils;

import java.sql.*;
import java.util.Date;

/**
 * author: youli
 * qq: 27855162@qq.com
 * date: 2020/5/11
 */

public class BaseDaoImpl implements IBaseDao {

    //使用protected修饰的成员本类和子类都可以使用，可以让子类去继承
    protected Connection conn = null;
    protected PreparedStatement st = null;
    protected ResultSet rs = null;

    /**
     * 用于新增记录的方法
     * @param sql
     * @param params
     * @return 返回新增记录的id值
     * @throws SQLException
     */
    @Override
    public int insertBySql(String sql, Object[] params){
        int id = -1;
        try {
            conn = DBUtils.getConnection();
            st = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            //提供数据
            if (params != null && params.length > 0) {
                for (int i = 0; i < params.length; i++) {
                    st.setObject(i + 1, params[i]);
                }
            }
            st.executeUpdate();
            rs = st.getGeneratedKeys();
            while(rs.next()){
                id = rs.getInt(1);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.close(conn, st, rs);
        }
        return id;
    }

    /**
     * 用于增删改的通用方法
     *
     * @return
     */
    public int updateBySql(String sql, Object[] params) {
        int ret = -1;
        try {
            //获取连接
            conn = DBUtils.getConnection();
            //创建Statement对象
            st = conn.prepareStatement(sql);
            //提供数据
            if (params != null && params.length > 0) {
                for (int i = 0; i < params.length; i++) {
                    st.setObject(i + 1, params[i]);
                }
            }
            //执行sql语句
            ret = st.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            DBUtils.close(conn, st, rs);
        }
        return ret;
    }

    /**
     * 用于查询的通用方法
     *
     * @return
     */
    public void queryBySql(String sql, Object[] params) {
        try {
            //获取连接
            conn = DBUtils.getConnection();
            //创建Statement对象
            st = conn.prepareStatement(sql);
            //提供参数
            //提供数据
            if (params != null && params.length > 0) {
                for (int i = 0; i < params.length; i++) {
                    st.setObject(i + 1, params[i]);
                }
            }
            //ResultSet中存放了具体的数据，那么就不适合在父类中处理，需要交给子类处理
            //将ResultSet交给子类处理，在子类处理完成之前，ResultSet不能关闭，否则就拿不到数据了。
            //这是不能再这里调用DBUtils.close(conn,st,rs);的原因，只能将其放在子类中
            rs = st.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
